﻿#region Header

//using System;
//using System.Collections.Generic;
//using System.Collections;
//using System.ComponentModel;
//using System.Reflection;
//using System.Text;
//using System.Threading;
//using BrainTechLLC.ThreadSafeObjects;
//namespace BrainTechLLC
//{
//    public static class ListFunctions
//    {
//        public static List<T> Take<T>(this List<T> items, Func<T, bool> action)
//        {
//            List<T> results = new List<T>();
//            for (int n = 0; n < items.Count; n++)
//            {
//                if (action(items[n]))
//                    results.Add(items[n]);
//            }
//            return results;
//        }
//        public static List<T> Take<T>(this IEnumerable items, Func<T, bool> action)
//        {
//            List<T> results = new List<T>();
//            foreach (T item in items)
//            {
//                if (action(item))
//                    results.Add(item);
//            }
//            return results;
//        }
//        public static void ForEachEnumValue<T>(this T max, Action<T> action) where T : struct
//        {
//            // Check performance hit we could take for doing this kind of type casting/conversion...
//            //Type testing = Enum.GetUnderlyingType(typeof(T));
//            int maxVal = (int)Convert.ChangeType(max, typeof(T));
//            for (int n = 0; n < maxVal; n++)
//            {
//                T item = (T)Enum.ToObject(typeof(T), n);
//                action(item);
//            }
//        }
//        public static IEnumerable<T> ForEach<T>(this IEnumerable<T> items, Action<T> action)
//        {
//            foreach (T item in items)
//                action(item);
//            return items;
//        }
//        public static IEnumerable<T> ForEachIfNotNull<T>(this IEnumerable<T> items, Action<T> action)
//        {
//            if (items == null)
//                return null;
//            foreach (T item in items)
//                action(item);
//            return items;
//        }
//        public static T[] ForEachAttribute<T>(this T[] attrs, Action<T> del)
//        {
//            if (attrs != null && attrs.Length > 0)
//            {
//                for (int n = 0; n < attrs.Length; n++)
//                {
//                    T attr = attrs[n];
//                    del(attr);
//                }
//            }
//            return attrs;
//        }
//        public static void ForEachMatch<T>(this IEnumerable<T> items, Func<T, bool> match, Action<T> action)
//        {
//            foreach (T item in items)
//            {
//                if (match(item))
//                    action(item);
//            }
//        }
//        public static IEnumerable ForEach<T>(this IEnumerable items, Action<T> action) where T : class
//        {
//            foreach (T item in items)
//                action(item);
//            return items;
//        }
//        public static T2[] PlaceInArray<T1, T2>(this List<T1> list, TDelegatePlain<T1, T2> del) where T1 : class
//        {
//            T2[] results = new T2[list.Count];
//            for (int n = 0; n < list.Count; n++)
//            {
//                T2 res = del(list[n]);
//                results[n] = res;
//            }
//            return results;
//        }
//        public static List<T> FindMatching<T>(this List<T> list, Func<T, bool> func) where T : class
//        {
//            List<T> results = new List<T>();
//            for (int n = 0; n < list.Count; n++)
//            {
//                if (func(list[n]))
//                    results.Add(list[n]);
//            }
//            return results;
//        }
//        public static T FindFirst<T>(this List<T> list, Func<T, bool> func) where T : class
//        {
//            for (int n = 0; n < list.Count; n++)
//            {
//                if (func(list[n]))
//                    return list[n];
//            }
//            return null;
//        }
//        public static List<T> ForEachBackwards<T>(this List<T> list, Action<T> action)
//        {
//            for (int n = list.Count - 1; n >= 0; n--)
//                action(list[n]);
//            return list;
//        }
//        public static T2 FindFirst<T1, T2>(this List<T1> list, out T1 item, Func<T1, T2> func)
//            where T1 : class
//            where T2 : class
//        {
//            for (int n = 0; n < list.Count; n++)
//            {
//                T2 found = func(list[n]);
//                if (found != null)
//                {
//                    item = list[n];
//                    return found;
//                }
//            }
//            item = null;
//            return null;
//        }
//        public static List<T> Apply<T>(this List<T> list, TDelegateGeneral<T> del) where T : class
//        {
//            for (int n = 0; n < list.Count; n++)
//            {
//                T entry = list[n];
//                del(entry);
//            }
//            return list;
//        }
//        public static string BuildList<T>(this List<T> items, StringBuilder sbReused, TDelegate<T, string> del)
//        {
//            sbReused.Length = 0;
//            if (items == null) return string.Empty;
//            for (int n = 0; n < items.Count; n++)
//            {
//                if (n > 0) sbReused.Append(", ");
//                string s = del(items[n]);
//                if (!string.IsNullOrEmpty(s)) { sbReused.Append(s); }
//            }
//            return sbReused.ToString();
//        }
//        public static string BuildList<T>(this List<T> items, TDelegate<T, string> del)
//        {
//            if (items == null) return string.Empty;
//            StringBuilder sb = new StringBuilder();
//            return items.BuildList(sb, del);
//        }
//        public static string BuildList<T>(this IEnumerable<T> items, TDelegate<T, string> del) where T : class
//        {
//            if (items == null) return string.Empty;
//            StringBuilder sb = new StringBuilder(1024);
//            int n = 0;
//            foreach (T item in items)
//            {
//                if (item == null) continue;
//                if (n > 0) sb.Append(", ");
//                string s = del(item);
//                if (!string.IsNullOrEmpty(s)) { sb.Append(s); n++; }
//            }
//            return sb.ToString();
//        }
//        public static bool ContainsIgnoreCase(this List<string> list, string s)
//        {
//            for (int j = 0; j < list.Count; j++)
//            {
//                if (list[j].Equals(s, StringComparison.OrdinalIgnoreCase))
//                    return true;
//            }
//            return false;
//        }
//        public static bool MoveUp<T>(this List<T> list, Func<T, bool> Match) where T : class
//        {
//            T temp = null;
//            int n = 1;
//            for (; n < list.Count; n++)
//            {
//                if (Match(list[n]))
//                {
//                    temp = list[n];
//                    list.RemoveAt(n);
//                    break;
//                }
//            }
//            if (temp != null) { list.Insert(n - 1, temp); }
//            return (temp != null);
//        }
//        public static bool MoveDown<T>(this List<T> list, Func<T, bool> Match) where T : class
//        {
//            T temp = null;
//            int n = 0;
//            for (; n < list.Count - 1; n++)
//            {
//                if (Match(list[n]))
//                {
//                    temp = list[n];
//                    list.RemoveAt(n);
//                    break;
//                }
//            }
//            if (temp != null) { list.Insert(n + 1, temp); }
//            return (temp != null);
//        }
//        public static void Swap<T>(this List<T> list, int n1, int n2) where T : class
//        {
//            T temp = list[n1];
//            list[n1] = list[n2];
//            list[n2] = temp;
//        }
//        public static void RemoveDuplicates<T>(this List<T> items) where T : class
//        {
//            for (int n = 0; n < items.Count; n++)
//            {
//                for (int j = items.Count - 1; j > n; j--)
//                {
//                    if (items[n] == items[j])
//                        items.RemoveAt(j);
//                }
//            }
//        }
//    }
//}

#endregion Header